#include "../_public.h"
#include "config.h"

#define PORT 8080

int main()
{

    // 通过配置文件得到服务器IP
    char server_ip[100] = {0};
    if (getparameter("server_ip", server_ip) != 0)
    {
        printf("Error: 从配置文件中无法读取正确的服务器IP.\n");
        return -1;
    }

    // 创建套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0)
    {
        printf("Error: Socket创建失败.\n");
        return -1;
    }

    // 连接到指定的服务器IP地址和端口
    struct sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    serv_addr.sin_addr.s_addr = inet_addr(server_ip);
    if (serv_addr.sin_addr.s_addr == INADDR_NONE)
    {
        printf("Error: 无效的IP或IP无法访问.\n");
        return -1;
    }

    // 尝试连接到指定的服务器地址
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        printf("Connection Failed\n");
        return -1;
    }

    // 登录认证循环
    char username[255] = {0};
    char password[255] = {0};
    char buffer[1024] = {0};
    int auth_success = 0;

    while (!auth_success)
    {
        // 清理buffer
        memset(buffer, 0, sizeof(buffer));

        // 接收服务器的提示消息并输入账号
        int n = recv(sock, buffer, sizeof(buffer), 0);
        if (n < 0)
        {
            perror("recv");
            close(sock);
            return -1;
        }
        printf("%s", buffer);
        fgets(username, sizeof(username), stdin);
        username[strcspn(username, "\n")] = 0; // 去掉换行符
        send(sock, username, strlen(username), 0);

        // 清理buffer
        memset(buffer, 0, sizeof(buffer));

        // 接收服务器的提示消息并输入密码
        n = recv(sock, buffer, sizeof(buffer), 0);
        if (n < 0)
        {
            perror("recv");
            close(sock);
            return -1;
        }
        printf("%s", buffer);
        fgets(password, sizeof(password), stdin);
        password[strcspn(password, "\n")] = 0; // 去掉换行符
        send(sock, password, strlen(password), 0);

        // 清理buffer
        memset(buffer, 0, sizeof(buffer));

        // 从服务器接收验证结果
        n = recv(sock, buffer, 1, MSG_WAITALL);
        if (n < 0)
        {
            perror("recv");
            close(sock);
            return -1;
        }
        printf("Server response: %s\n", buffer);

        // if (strcmp(buffer, "1") == 0) {
        //     auth_success = 1;
        // } else {
        //     printf("用户名或密码错误，请重新输入。\n");
        // }
        if (strcmp(buffer, "0") == 0)
        {
            printf("用户名或密码错误\n");
            return 0;
        }
        auth_success = 1;
    }

    // 清理buffer
    memset(buffer, 0, sizeof(buffer));

    // 客户端从标准输入输入命令，不知道执行次数
    while (1)
    {
        // 从标准输入读取的字符串并且去除行末的换行符
        printf("请输入命令: ");
        fgets(buffer, sizeof(buffer), stdin);
        buffer[strcspn(buffer, "\n")] = 0;

        // 使用strtok拆分输入的命令
        char *command = strtok(buffer, " ");
        char *argument = strtok(NULL, " ");

        // 空字符串
        if (command == NULL)
        {
            printf("Error: 无效的命令\n");
            // 使用continue跳过本次循环，继续等待用户输入下一个命令
            continue;
        }

        // 打印拆分得到的命令和参数
        printf("Command: %s\n", command);
        if (argument != NULL)
        {
            printf("Argument: %s\n", argument);
        }
        else
        {
            printf("No argument provided\n");
        }

        // 构造要发送的消息，把命令和参数合并
        char message[1024];
        snprintf(message, sizeof(message), "%s %s", command, argument ? argument : "");

        // 发送数据
        if (send(sock, message, strlen(message), 0) < 0)
        {
            perror("send");
            close(sock);
            return -1;
        }

        // 清理buffer
        memset(buffer, 0, sizeof(buffer));

        // 读取数据
        int n = read(sock, buffer, sizeof(buffer));
        if (n < 0)
        {
            perror("read");
            close(sock);
            return -1;
        }
        printf("Server response: %s\n", buffer);

        // 清理buffer
        memset(buffer, 0, sizeof(buffer));
    }

    // 关闭套接字
    close(sock);

    return 0;
}
